package com.social.dao;

import com.social.model.Comment;
import com.social.model.Log;
import com.social.model.Reply;
import com.social.util.DBUtil;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class LogDao {

    String sql = null;
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    // =======================================================================================================================
    // =====================================================插入日志信息=====================================================
    // =========================================================@lwz=========================================================
    public int insertLog(Log log) {
        // 因为在数据库的图片地址我最多设了3个所以长度为3
        String[] path = new String[3];

        // 接收数据库的存储的图片地址数组
        path = log.getImgAdreess();

        // 设置count，检测这个图片地址数组到底存了几个信息
        int count = 0;
        for (String element : path) {
            if (element != null) {
                count++;
            }
        }
        // 加5是因为最少也要插入5个信息，日志id不用插入，我在数据库给它设置了自增
        int loopNum = count + 5;

        if (loopNum == 6) {
            // 6个问号
            sql = "INSERT INTO log (user_id,scope,content,create_time,like_num,img_address_1) VALUES (?,?,?,?,?,?)";
        } else if (loopNum == 7) {
            // 7个问号
            sql = "INSERT INTO log (user_id,scope,content,create_time,like_num,img_address_1,img_address_2) VALUES (?,?,?,?,?,?,?)";
        } else if (loopNum == 8) {
            // 8个问号
            sql = "INSERT INTO log (user_id,scope,content,create_time,like_num,img_address_1,img_address_2,img_address_3) VALUES (?,?,?,?,?,?,?,?)";
        } else {
            // 5个问号
            sql = "INSERT INTO log (user_id,scope,content,create_time,like_num) VALUES (?,?,?,?,?)";
        }

        try {
            conn = DBUtil.getConnection();
            pstmt = conn.prepareStatement(sql);

            pstmt.setString(1, log.getUserId());
            pstmt.setString(2, log.getScope()); // 保持原样，插入时scope是字符串形式的数字
            pstmt.setString(3, log.getContent());
            pstmt.setTimestamp(4, new Timestamp(log.getCreateTime().getTime()));
            pstmt.setInt(5, log.getLikeNum());

            if (loopNum == 6) {
                pstmt.setString(6, path[0]);
            } else if (loopNum == 7) {
                pstmt.setString(6, path[0]);
                pstmt.setString(7, path[1]);
            } else if (loopNum == 8) {
                pstmt.setString(6, path[0]);
                pstmt.setString(7, path[1]);
                pstmt.setString(8, path[2]);
            }

            pstmt.executeUpdate();
            System.out.println("插入成功");
            return 1;
        } catch (SQLException e) {
            System.out.println("插入失败");
            e.printStackTrace();
            return 0;
        } finally {
            DBUtil.close(conn, pstmt, rs);
        }
    }

    // =======================================================================================================================
    // =====================================================删除日志信息=====================================================
    // =========================================================@lwz=========================================================
    // 是根据日志id进行删除的
    public int deleteLog(int id) {
        String sql = "DELETE FROM log WHERE id = ?";
        try {
            conn = DBUtil.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, id);
            pstmt.executeUpdate();
            System.out.println("删除成功");
            return 1;

        } catch (SQLException e) {
            System.out.println("删除失败");
            e.printStackTrace();
            return 0;
        } finally {
            DBUtil.close(conn, pstmt, rs);
        }
    }




    //    =======================================================================================================================
// ==============================================获取用户昵称和头像方便我们插入评论表=====================================================
//    =========================================================@lwz=========================================================

    public String[] getNickname_Avatar(String user_Id){
        String[] result = null;
        String sql = "SELECT nickname,avatar From user WHERE userid = ?";
        try{
            conn = DBUtil.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,user_Id);
            ResultSet rs = pstmt.executeQuery();
            if(rs.next()){
                result = new String[3];
                result[0] = rs.getString("nickname");
                result[1] = rs.getString("avatar");

                return result;
            }
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtil.close(conn,pstmt,rs);
        }
        return  result;
    }


    //    =======================================================================================================================
//    =====================================================添加评论=====================================================
//    =========================================================@lwz=========================================================
    public int addComment(Comment c){
        String sql = "INSERT INTO comment (log_id,nick_name,avatar,content) VALUES (?,?,?,?)";
        try {
            conn = DBUtil.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,c.getLogId());
            pstmt.setString(2,c.getNickname());
            pstmt.setString(3,c.getAvatar());
            pstmt.setString(4,c.getContent());
            pstmt.executeUpdate();



            return 1;
        }catch (SQLException e) {
            System.out.println("删除失败");
            e.printStackTrace();
            return 0;
        } finally {
            DBUtil.close(conn, pstmt,rs);

        }

    }


    //    =======================================================================================================================
//    ========================================用于评论的展示根据日志id返回nick_name，avatar，以及content还有我们的评论id=====================================================
//    =========================================================@lwz=========================================================

    public List<Comment> getNickname_Avatar(int log_Id, int page, int pageSize){
        List<Comment> comment = new ArrayList<>();

        String sql = "SELECT nick_name,avatar,content,c_id From comment WHERE log_id = ? LIMIT ? OFFSET ?";
        try{
            conn = DBUtil.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,log_Id);
            pstmt.setInt(2,pageSize);
            pstmt.setInt(3,(page-1)*pageSize);
            ResultSet rs = pstmt.executeQuery();
            while(rs.next()){
                Comment c = new Comment();
                c.setNickname(rs.getString("nick_name"));
                c.setAvatar(rs.getString("avatar"));
                c.setContent(rs.getString("content"));
                c.setC_id(rs.getInt("c_id"));
                comment.add(c);

            }
            return comment;

        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtil.close(conn,pstmt,rs);
        }
        return  comment;
    }

    //    =======================================================================================================================
//    =============================================用于评论的展示根据日志id返回nick_name，avatar，以及content=====================================================
//    =========================================================@lwz=========================================================

    public Log getUserIDContentAndImg(int log_Id){
        Log l = new Log();

        String sql = "SELECT user_id, content, img_address_1, img_address_2, img_address_3, create_time From log WHERE id = ? ";
        try{
            conn = DBUtil.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,log_Id);

            ResultSet rs = pstmt.executeQuery();
            if(rs.next()){
                l.setUserId(rs.getString("user_id"));
                l.setContent(rs.getString("content"));

                // 处理图片（最多3张）
                String[] imgs = new String[3];
                imgs[0] = rs.getString("img_address_1");
                imgs[1] = rs.getString("img_address_2");
                imgs[2] = rs.getString("img_address_3");
                l.setImgAdreess(imgs);

                l.setCreateTime(rs.getTimestamp("create_time"));
                return l;
            }

        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtil.close(conn,pstmt,rs);
        }
        return  l;
    }


    public int commentCount(int logId){
        String sql = "SELECT COUNT(*) FROM comment WHERE log_id = ?";
        try (Connection conn = DBUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setInt(1, logId);
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                return rs.getInt(1);
            }

        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtil.close(conn,pstmt,rs);
        }
        return 0;
    }


    //    =======================================================================================================================
//    ==============================将评论的回复插入到回复表中去，包括c_id,nick_name,avatar,content=====================================================
//    =========================================================@lwz=========================================================
    public int insertReply(Reply r){
        String sql = "INSERT INTO reply (c_id,nick_name,avatar,r_content) VALUES (?,?,?,?)";
        try {
            conn = DBUtil.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,r.getC_id());
            pstmt.setString(2,r.getNickname());
            pstmt.setString(3,r.getAvatar());
            pstmt.setString(4,r.getR_content());
            pstmt.executeUpdate();

            return 1;
        }catch (SQLException e) {
            System.out.println("删除失败");
            e.printStackTrace();
            return 0;
        } finally {
            DBUtil.close(conn, pstmt,rs);

        }

    }

    //    =======================================================================================================================
//    ==============================根据c_id,也就是评论id，返回所有评论的回复=====================================================
//    =========================================================@lwz=========================================================

    public List<Reply> returnReply(int c_id){
        List<Reply> replies = new ArrayList<>();

        String sql = "SELECT nick_name,avatar,r_content From reply WHERE c_id = ?";
        try{
            conn = DBUtil.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1,c_id);

            ResultSet rs = pstmt.executeQuery();
            while(rs.next()){
                Reply r = new Reply();

                r.setNickname(rs.getString("nick_name"));
                r.setAvatar(rs.getString("avatar"));
                r.setR_Content(rs.getString("r_content"));

                replies.add(r);

            }
            return replies;

        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtil.close(conn,pstmt,rs);
        }
        return  replies;
    }






    //    =======================================================================================================================
//    ===================================================根据日志id返回日志点赞数量=====================================================
//    =========================================================@lwz=========================================================


//    public int getlikeNum(int log_Id){
//        int result;
//        String sql = "SELECT like_num FROM log WHERE id = ?";
//
//        try{
//            conn=DBUtil.getConnection();
//            pstmt = conn.prepareStatement(sql);
//            pstmt.setInt(1,log_Id);
//
//            ResultSet rs = pstmt.executeQuery();
//            if(rs.next()){
//                result = rs.getInt("like_num");
//                return result;
//            }
//
//
//        }catch(SQLException e){
//            e.printStackTrace();
//        }finally {
//            DBUtil.close(conn,pstmt,rs);
//        }
//
//
//        return -1;
//    }

    //    =======================================================================================================================
//    ==================================根据传过来的value和日志id以及用户的点击确认增加还是减少点赞量=====================================================
//    =========================================================@lwz=========================================================
//确认用户是否对当前日志点过赞的方法在下面
//    public int like_And_cancel_Like(int log_Id,int value){
//        String sql = "";
//        if(value == 0){
//            sql = "UPDATE log SET like_num = like_num - 1 WHERE id = ?";
//        }else if(value ==1){
//            sql = "UPDATE log SET like_num = like_num + 1 WHERE id = ?";
//        }
//        try{
//            conn = DBUtil.getConnection();
//            pstmt = conn.prepareStatement(sql);
//            pstmt.setInt(1,log_Id);
//            pstmt.executeUpdate();
//            return 1;
//        }catch (SQLException e){
//            e.printStackTrace();
//        }finally {
//            DBUtil.close(conn,pstmt,rs);
//        }
//        return 0;
//    }

    //    =======================================================================================================================
//    ==================================判断是否点过赞，如过点过赞，返回value值1=====================================================
//    =========================================================@lwz=========================================================

//    public int isLike(int log_Id,String user_Id){
//        try {
//            conn = DBUtil.getConnection();
//            String sql = "SELECT COUNT(*) AS count FROM like_table WHERE id = ? AND user_id =?";
//            pstmt = conn.prepareStatement(sql);
//            pstmt.setInt(1,log_Id);
//            pstmt.setString(2,user_Id);
//
//            //rs在最开始就定义了
//            rs = pstmt.executeQuery();
//
//            if(rs.next()){
//                int count = rs.getInt("count");
//                return count > 0 ? 1 : 0;
//            }else{
//                return 0;
//            }
//        } catch (SQLException e) {
//            e.printStackTrace();
//        }finally {
//            DBUtil.close(conn,pstmt,rs);
//        }
//
//        return 0;
//    }


    // 获取日志列表时包含点赞/点踩计数
    public List<Log> getLogsByScopeAndPage(String scope, int page, int pageSize) throws SQLException {
        String sql = "SELECT id, user_id, scope, content, img_address_1, img_address_2, img_address_3, create_time " +
                "FROM log " +
                "WHERE scope = ? " +
                "ORDER BY create_time DESC " +
                "LIMIT ? OFFSET ?";

        try (Connection conn = DBUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, scope);
            pstmt.setInt(2, pageSize);
            pstmt.setInt(3, (page - 1) * pageSize);

            ResultSet rs = pstmt.executeQuery();
            List<Log> logs = new ArrayList<>();
            LikeDislikeDao likeDislikeDao = new LikeDislikeDao();
            while (rs.next()) {
                Log log = new Log();
                log.setId(rs.getInt("id"));
                log.setUserId(rs.getString("user_id"));
                log.setScope(rs.getString("scope"));
                log.setContent(rs.getString("content"));

                // 处理图片
                String[] imgs = new String[3];
                imgs[0] = rs.getString("img_address_1");
                imgs[1] = rs.getString("img_address_2");
                imgs[2] = rs.getString("img_address_3");
                log.setImgAdreess(imgs);

                log.setCreateTime(rs.getTimestamp("create_time"));

                // 设置点赞和点踩数
                log.setLikeNum(likeDislikeDao.getLikeCount(log.getId()));
                log.setDislikeNum(likeDislikeDao.getDislikeCount(log.getId()));

                logs.add(log);
            }
            return logs;
        }
    }

    // 统计某scope的日志总数（scope作为数字处理）
    public int countLogsByScope(String scope) throws SQLException {
        String sql = "SELECT COUNT(*) FROM log WHERE scope = ?";

        try (Connection conn = DBUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, scope); // 接收字符串形式的数字（如 "1"）
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                return rs.getInt(1);
            }
            return 0;
        }
    }

    // 统计用户的日志总数
    public int countUserLogs(String userId) throws SQLException {
        String sql = "SELECT COUNT(*) FROM log WHERE user_id = ?";
        try (Connection conn = DBUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, userId);
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                return rs.getInt(1);
            }
            return 0;
        }
    }

    // 分页查询用户的日志
    public List<Log> getUserLogsByPage(String userId, int page, int pageSize) throws SQLException {
        String sql = "SELECT * FROM log WHERE user_id = ? ORDER BY create_time DESC LIMIT ? OFFSET ?";
        try (Connection conn = DBUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, userId);
            pstmt.setInt(2, pageSize);
            pstmt.setInt(3, (page - 1) * pageSize);

            ResultSet rs = pstmt.executeQuery();
            List<Log> logs = new ArrayList<>();
            while (rs.next()) {
                Log log = new Log();
                log.setId(rs.getInt("id"));
                log.setUserId(rs.getString("user_id"));
                log.setScope(rs.getString("scope"));
                log.setContent(rs.getString("content"));
                String[] imgs = new String[3];
                imgs[0] = rs.getString("img_address_1");
                imgs[1] = rs.getString("img_address_2");
                imgs[2] = rs.getString("img_address_3");
                log.setImgAdreess(imgs);
                log.setCreateTime(rs.getTimestamp("create_time"));
                logs.add(log);
            }
            return logs;
        }
    }


}